#!/usr/bin/env python
# -*- coding: utf-8 -*-

# Módulos 
import sys, gtk, pygame, utils, objetos
from pygame.locals import *

# Constantes


# Clases
# ---------------------------------------------------------------------
# clase de una letra de la palabra a ser ordenada        
class Letra(pygame.sprite.Sprite):
	def __init__(self,letra,posx,posy):
		fuente = pygame.font.Font("fonts/justadream_solid.ttf", int(30*utils.RES))
		self.image = pygame.font.Font.render(fuente, letra, 1, (50,50,255))
		self.rect = self.image.get_rect()
		self.rect.centerx = posx
		self.rect.centery = posy
		self.x_ini = posx
		self.y_ini = posy
		self.valor = letra
		self.drag = 0
		self.correcta = False
		self.sonido_correcto = pygame.mixer.Sound("sounds/click.wav")
		self.sonido_fallo = pygame.mixer.Sound("sounds/fallo.wav")
			
# Clase del lugar donde debe ser colocada la letra de la palabra a ordenar
class Match:
	def __init__(self,letra,posx,posy):
		self.valor = letra
		self.posx = posx
		self.posy = posy
		self.ocupado = False

# Imagen que indica que la palabra esta ordenada
class Check:
	def __init__(self,posx,posy):
		self.image = utils.load_image('images/check.png', True)
		self.rect = self.image.get_rect()
		self.rect.centerx = posx
		self.rect.centery = posy
		self.show = False
	
# Clase que contiene un sonido y su posicion de activacion
class Sonido:
	def __init__(self,path,posx,posy):
		self.sonido = pygame.mixer.Sound(path)
		self.rect = pygame.Rect(0, 0, 50, 50)
		self.rect.centerx = posx
		self.rect.centery = posy	

# ---------------------------------------------------------------------
# identifica si una letra esta siendo arrastrada
def detectar_arrastre(palabra):
	x,y = pygame.mouse.get_pos()
	for item in palabra:
		if(item.rect.collidepoint(pygame.mouse.get_pos())):
			item.drag = True
# controla en donde se ha soltado la letra para saber si esta en el lugar correcto			
def soltar(palabra, palabra_match):
	for letra in palabra:
		if letra.drag == True:
			letra.drag = False
			#print("Suelta letra")
			for match in palabra_match:
				# si esta en el lugar correcto fija la letra en cuestion en esa posicion
				if letra.valor == match.valor and abs(letra.rect.centerx - match.posx) < 10 and abs(letra.rect.centery - match.posy) < 10 and match.ocupado == False:
					letra.rect.centerx = match.posx
					letra.rect.centery = match.posy
					letra.correcta = True
					#print("iguales "+letra.valor+"-"+match.valor)
					match.ocupado = True
					letra.sonido_correcto.play()
					break
			# si no se encuentra en el lugar correcto entonces la letra vuelve a la posicion original		
			if(letra.correcta == False):
					letra.rect.centerx = letra.x_ini
					letra.rect.centery = letra.y_ini
					letra.sonido_fallo.play()
					#print("vuelve a la posicion original")

#mueve las letras si estan siendo arrastradas por el mouse
def actualizar_letras(palabra):
	for item in palabra:
		if(item.drag == True):
			item.rect.centerx,item.rect.centery = pygame.mouse.get_pos()

# verifica si las palabras estan ordenadas			
def verificar_orden(palabra):
	
	for item in palabra:
		if item.ocupado == False:
			return False
				
	#print("Palabra ordenada")
	return True	
	return True	
			
def dibujar(screen,cursor_picture, clock):
    salir = 0
    background_image = utils.load_image('images/fondo1_2.png')
    #boton de la flecha para continuar
    btn_adelante = objetos.BotonAdelante()
    btn_atras = objetos.BotonAtras()
    #texto superior derecho que indica el numero de clase
    clase1, clase1_rect = utils.texto_clase("Clase 1", 750*utils.RES, 15*utils.RES)
           
    titulo, titulo_rect = utils.texto_subtitulo_azul("AMBIENTE URBANO Y RURAL", 380*utils.RES, 70*utils.RES)
    linea1,linea1_rect = utils.texto_normal('Los cartelitos nombran algunos elementos vivientes y no vivientes que forman', 400*utils.RES,110*utils.RES)
    linea2,linea2_rect = utils.texto_normal('parte del ambiente urbano y rural. ¡Pero las letras en cada uno se mezlcaron!', 398*utils.RES,135*utils.RES)
    linea3,linea3_rect = utils.texto_normal('¡Ordenalas correctamente!', 400*utils.RES,160*utils.RES,(50,50,255))
    texto_final,texto_final_rect = utils.texto_subtitulo('¡Excelente ahora estan todos ordenados!', 400*utils.RES,460*utils.RES)
    
    # vectores con las letras de las palabras a ordenar
    x = 60
    y = 220
    caballo = (Letra("L",x*utils.RES,y*utils.RES),Letra("L",(20+x)*utils.RES,y*utils.RES),Letra("A",(40+x)*utils.RES,y*utils.RES),Letra("C",(60+x)*utils.RES,y*utils.RES),Letra("O",(80+x)*utils.RES,y*utils.RES),Letra("B",(100+x)*utils.RES,y*utils.RES),Letra("A",(120+x)*utils.RES,y*utils.RES))
    caballo_match = (Match("C",x*utils.RES,(40+y)*utils.RES),Match("A",(20+x)*utils.RES,(40+y)*utils.RES),Match("B",(40+x)*utils.RES,(40+y)*utils.RES),Match("A",(60+x)*utils.RES,(40+y)*utils.RES),Match("L",(80+x)*utils.RES,(40+y)*utils.RES),Match("L",(100+x)*utils.RES,(40+y)*utils.RES),Match("O",(120+x)*utils.RES,(40+y)*utils.RES))
    caballo_linea = Letra(".....................", (60+x)*utils.RES,(45+y)*utils.RES)
    x = 60
    y = 320
    girasol = (Letra("S",x*utils.RES,y*utils.RES),Letra("L",(20+x)*utils.RES,y*utils.RES),Letra("O",(40+x)*utils.RES,y*utils.RES),Letra("I",(60+x)*utils.RES,y*utils.RES),Letra("R",(80+x)*utils.RES,y*utils.RES),Letra("A",(100+x)*utils.RES,y*utils.RES),Letra("G",(120+x)*utils.RES,y*utils.RES))
    girasol_match = (Match("G",x*utils.RES,(40+y)*utils.RES),Match("I",(20+x)*utils.RES,(40+y)*utils.RES),Match("R",(40+x)*utils.RES,(40+y)*utils.RES),Match("A",(60+x)*utils.RES,(40+y)*utils.RES),Match("S",(80+x)*utils.RES,(40+y)*utils.RES),Match("O",(100+x)*utils.RES,(40+y)*utils.RES),Match("L",(120+x)*utils.RES,(40+y)*utils.RES))
    girasol_linea = Letra(".....................", (60+x)*utils.RES,(45+y)*utils.RES)
    x = 620
    y = 220
    tractor = (Letra("R",x*utils.RES,y*utils.RES),Letra("T",(20+x)*utils.RES,y*utils.RES),Letra("C",(40+x)*utils.RES,y*utils.RES),Letra("A",(60+x)*utils.RES,y*utils.RES),Letra("O",(80+x)*utils.RES,y*utils.RES),Letra("R",(100+x)*utils.RES,y*utils.RES),Letra("T",(120+x)*utils.RES,y*utils.RES))
    tractor_match = (Match("T",x*utils.RES,(40+y)*utils.RES),Match("R",(20+x)*utils.RES,(40+y)*utils.RES),Match("A",(40+x)*utils.RES,(40+y)*utils.RES),Match("C",(60+x)*utils.RES,(40+y)*utils.RES),Match("T",(80+x)*utils.RES,(40+y)*utils.RES),Match("O",(100+x)*utils.RES,(40+y)*utils.RES),Match("R",(120+x)*utils.RES,(40+y)*utils.RES))
    tractor_linea = Letra(".....................", (60+x)*utils.RES,(45+y)*utils.RES)
    
    x = 620
    y = 320
    molino = (Letra("O",x*utils.RES,y*utils.RES),Letra("O",(20+x)*utils.RES,y*utils.RES),Letra("L",(40+x)*utils.RES,y*utils.RES),Letra("N",(60+x)*utils.RES,y*utils.RES),Letra("I",(80+x)*utils.RES,y*utils.RES),Letra("M",(100+x)*utils.RES,y*utils.RES))
    molino_match = (Match("M",x*utils.RES,(40+y)*utils.RES),Match("O",(20+x)*utils.RES,(40+y)*utils.RES),Match("L",(40+x)*utils.RES,(40+y)*utils.RES),Match("I",(60+x)*utils.RES,(40+y)*utils.RES),Match("N",(80+x)*utils.RES,(40+y)*utils.RES),Match("O",(100+x)*utils.RES,(40+y)*utils.RES))
    molino_linea = Letra("................", (50+x)*utils.RES,(45+y)*utils.RES)
         
    palabras = (caballo,girasol,tractor,molino)
    palabras_match = (caballo_match,girasol_match,tractor_match,molino_match)
    palabras_linea = (caballo_linea,girasol_linea,tractor_linea,molino_linea)
      
    checks = (Check(100*utils.RES,220*utils.RES),Check(100*utils.RES,320*utils.RES),Check(660*utils.RES,220*utils.RES),Check(660*utils.RES,320*utils.RES))     
    
    campo = utils.load_image('images/c1_campo.png', False)
    
    sonidos = (Sonido("sounds/caballo.ogg",500*utils.RES,400*utils.RES),Sonido("sounds/vaca.ogg",400*utils.RES,320*utils.RES))
    
    show_dialog = False
    
    frame = 0
    
    while salir == 0:
    
    	# Pump GTK messages.
		while gtk.events_pending():
			gtk.main_iteration()
			
		for eventos in pygame.event.get():
			if eventos.type == QUIT:
				sys.exit(0)
			elif eventos.type == pygame.VIDEORESIZE:
			   pygame.display.set_mode(eventos.size, pygame.RESIZABLE)	
			elif eventos.type == MOUSEBUTTONDOWN:
				if btn_adelante.rect.collidepoint(pygame.mouse.get_pos()):
					salir = 5
					btn_adelante.sonido.play()	
				elif btn_atras.rect.collidepoint(pygame.mouse.get_pos()):
					salir = 3
					btn_atras.sonido.play()		
				for palabra in palabras:
					detectar_arrastre(palabra)
				for sonido in sonidos:
					if sonido.rect.collidepoint(pygame.mouse.get_pos()):
						sonido.sonido.play()	
			elif eventos.type == MOUSEBUTTONUP:
				for i in range(4):
					soltar(palabras[i],palabras_match[i])
		
		#Actualiza los elementos arrastrados
		completo = True
		for i in range(4):
			actualizar_letras(palabras[i])
			if verificar_orden(palabras_match[i]):
				checks[i].show = True
			else:
				completo = False	
		# Realiza la animacion del texto				
	
		screen.blit(background_image, (0, 0))
		screen.blit(clase1, clase1_rect)
		if frame > 20:			
			screen.blit(titulo, titulo_rect)
		if frame > 50:			
			screen.blit(linea1,linea1_rect)
			screen.blit(linea2,linea2_rect)
			screen.blit(linea3,linea3_rect)
		if frame > 100:				
			screen.blit(campo, (200*utils.RES,190*utils.RES))
			#for sonido in sonidos:
			#	pygame.draw.rect(screen,(200,200,200),sonido.rect)
		if frame > 120:			
			for i in range(4):
				for letra in palabras[i]:
					screen.blit(letra.image,letra.rect)
				screen.blit(palabras_linea[i].image,palabras_linea[i].rect)	
		for check in checks:
			if check.show:
				screen.blit(check.image,check.rect)	
		if completo:
			screen.blit(texto_final,texto_final_rect)	
		screen.blit(btn_adelante.image, btn_adelante.rect)
		screen.blit(btn_atras.image, btn_atras.rect)
		screen.blit(cursor_picture, pygame.mouse.get_pos())
		pygame.display.flip()

		# Try to stay at 30 FPS
		clock.tick(30)
		frame = frame + 1
                	 
    return salir

# This function is called when the game is run directly from the command line:
# ./TestGame.py 
def main():
	
	pygame.init()
	screen = pygame.display.set_mode((int(800*utils.RES), int(520*utils.RES)), pygame.RESIZABLE) #pygame.display.get_surface() #

	# Fake a Sugar cursor for the pyGame canvas area
	pygame.mouse.set_cursor((8,8),(0,0),(0,0,0,0,0,0,0,0),(0,0,0,0,0,0,0,0))
	cursor_picture = pygame.image.load('images/standardcursor.png')
	cursor_picture.convert_alpha() 
	clock = pygame.time.Clock()
	dibujar(screen,cursor_picture,clock)

if __name__ == '__main__':
   main()
